package com.tedu.API.IO;

import org.junit.Test;

import java.io.File;
import java.io.IOException;

/**
 * IO: 传输数据  C/S 聊天室 Version
 * API的上部分：字符串，包装类，日期类，集合
 * ---------- 电脑三大件：cpu 硬盘 内存
 * API下部分：IO流  ---硬盘 文件数据传输
 * <p>
 * 包位置：java.io
 * File文件,文件夹类
 * 作用：用于操作系统中系统的一个文件和操作目录：文件夹
 * 创建File对象--->有参构造器中指定路径-->"路径+文件夹全称/文件"
 * <p>
 * File类方法类使用：
 * 1.查看该文件或者“文件夹/目录”的属性信息（名字，大小，是否存在）
 * 2.操作文件或者目录（删除和创建）
 * 3.访问目录的子项
 */
public class FileAPI {
    @Test
    public void testFile() {
        //创建文件类
        //当前的API下创建文件---手动---demo.txt char r=""+File.separator+""
//        File file=new File("D:"+File.separator+"java-api"+File.separator+"API" +
//                ""+File.separator+"src"+File.separator+"main"+File.separator+"java"+File.separator+"com"+
//                File.separator+"tedu"+File.separator+"API"+File.separator+"IO"+File.separator+"demo.txt");
        //相对路径---当前API下创建文件！  项目：Maven 结构 main编写代码
        //FileAPI 相对于项目 API项目下 从src开始
        //操作系统：路径 \ 代表路径 文件上传至服务器
        //            / 代表路径 文件下载到本地
        //java任何平台【操作系统】运行: 统一路径属性
        //File.separator  静态属性：任何操作系统下转换成正确的路径表示方式
        File file = new File("src" + File.separator + "main" +
                "" + File.separator + "java" + File.separator + "com" +
                "" + File.separator + "tedu" + File.separator + "API" +
                "" + File.separator + "IO" + File.separator + "demo.txt");
        //判断文件是否存在的方法
        boolean b = file.exists();
        System.out.println("判断文件是否存在" + b);
    }

    /**
     * 查看文件或者目录的属性信息：
     * getName()  返回值 String
     * 作用：获取文件的名字【注意：不看路径是否对错】
     * length()  返回值 ：long
     * 作用: 返回当前文件的大小【字节量的方式判断大小】
     * exists() 返回值 boolean
     * 作用：判断文件是否存在
     */
    @Test
    public void testFileGL() throws IOException {
        //创建文件类--路径：Maven项目---相对路径
        //相对路径： ./ 当前API项目下
        File file = new File("." + File.separator + "demo.txt");
        //打印file的路径
        System.out.println("打印file路径：" + file.getCanonicalPath());
        //文件是否存在
        System.out.println("路径摁键是否存在" + file.exists());
        //获取文件名字
        String name = file.getName();
        System.out.println("文件或者目录的名字" + name);
        //获取文件的大小【字节量】
        long len = file.length();
        System.out.println("获取文件的大小【字节量】" + len);

    }

    /**
     * 使用代码完成文件或者目录自动创建
     * createNewFile()
     * 作用：创建一个新文件
     * 使用代码完成 API项目文件夹下 文件自动创建 test.txt文件
     */
    @Test
    public void testCreate() throws IOException {
        //创建文件类 :路径+全称 ./test.txt
        File file = new File("." + File.separator + "test.txt");
        //判断如果文件不存在--创建
        //判断文件存在--不创建
        if (!file.exists()) {
            System.out.println("文件不存在");
            file.createNewFile();
            System.out.println("文件已经创建");
        } else {
            System.out.println("文件存在");
        }
    }

    /**
     * delete()
     * 作用：删除文件或者文件夹/目录
     * 需求：使用代码将API项目下 test.txt 删除
     */
    @Test
    public void testDelete() {
        //创建File类 路径：./test.txt ./不写代表 当前API项目
        File file = new File("test.txt");
        //判断 如果文件存在删除
        if (file.exists()) {
            System.out.println("文件存在");
            file.delete();
            System.out.println("文件已经删除");
        } else {
            System.out.println("文件不存在");
        }
    }

    /**
     * mkdir()
     * 作用：创建一个文件夹
     * 需求：在API项目下创建一个文件夹 demo
     * <p>
     * 多层文件夹：demo/abc/bcd
     * mkdirs()
     * 作用：创建多层文件夹
     */
    @Test
    public void tsetMkdir() throws IOException {
        //创建File文件/文件夹
        File file = new File("demo" +
                "" + File.separator + "abc" +
                "" + File.separator + "bcd");
        //判断 如果文件夹不存在 创建文件夹
        //       文件夹存在  不创建
        if (!file.exists()) {
            System.out.println("不存在demo文件夹");
            file.mkdirs();
            System.out.println("已经创建");
        } else {
            String str = file.getCanonicalPath();
            System.out.println("已经存在，返回路径：" + str);
        }
        if (file.exists() == true) {
            if (file.exists() == true) {
                if (file.exists() == true) {
                    file.delete();
                }
                file.delete();
            }
            file.delete();
        }

    }


    /**
     * 作业1：多层目录 demo/abc/bcd ,删除  【不能使用递归】
     *  提示：构造器 new File(File parent,"子路径")
     * 思路：【bcd删除完毕--abc--demo】
     */

    /**
     * 访问文件夹---->所有子项【文件夹和文件】
     * listFiles()  返回值 file[] 文件数组
     * 获取文件夹的所有子项【包含文件夹和文件】
     * isFile()  返回值 boolean
     * 作用：判断是否为文件 是文件 true ,反之 false
     * isDirectory()  返回值 boolean
     * 作用：判断是否为文件夹/目录 是目录返回true
     * 需求：获取到API项目下所有的文件夹名字
     */
    @Test
    public void testListFiles() throws IOException {
        //获取API的目录
        File file = new File("." + File.separator);
        System.out.println("路径：" + file.getCanonicalPath());
        //过滤文件和文件夹,过滤是文件夹
        if (file.isDirectory()) {//过滤没有效果
            //获取到所有的文件夹
            File[] fileDirectory = file.listFiles();
            //遍历所有文件夹的名字
            for (int i = 0; i < fileDirectory.length; i++) {//i拿到所有的下标
                //打印文件夹名字  数组引用+下标
                System.out.println("打印所有文件夹的名字" + fileDirectory[i].getName());
            }
        }
    }

    @Test
    public void testHomeWork1() {
        //创建多层文件夹/目录
        File file = new File("." + File.separator + "demo" +
                "" + File.separator + "abc" +
                "" + File.separator + "bcd");
        if (!file.exists()) {
            System.out.println("创建");
            file.mkdirs();
        } else {
            System.out.println("存在");
        }
        // 一层一层删除
        File parent = new File("demo");
        File child1 = new File(parent, "abc");
        File child2 = new File(child1, "bcd");
        child2.delete();
        child1.delete();
        parent.delete();

    }
}
